package com.zbangmall.util.common;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Description:
 * 封装一些正则相关的操作
 */
public final class RegUtil {

	/**
	 * Alphanumeric characters
	 */
	public static final String  REG_ALNUM               = "\\p{Alnum}";
	/**
	 * Alphabetic characters
	 */
	public static final String  REG_ALPHA               = "\\p{Alpha}";
	/**
	 * ASCII characters
	 */
	public static final String  REG_ASCII               = "\\p{ASCII}";
	/**
	 * Space and tab
	 */
	public static final String  REG_BLANK               = "\\p{Blank}";
	/**
	 * Control characters
	 */
	public static final String  REG_CNTRL               = "\\p{Cntrl}";
	/**
	 * Digits
	 */
	public static final String  REG_DIGITS              = "\\p{Digit}";
	/**
	 * SVisible characters (i.e. anything except spaces, control characters, etc.)
	 */
	public static final String  REG_GRAPH               = "\\p{Graph}";
	/**
	 * Lowercase letters
	 */
	public static final String  REG_LOWER               = "\\p{Lower}";
	/**
	 * Visible characters and spaces (i.e. anything except control characters, etc.)
	 */
	public static final String  REG_PRINT               = "\\p{Print}";
	/**
	 * Punctuation and symbols.
	 */
	public static final String  REG_PUNCT               = "\\p{Punct}";
	/**
	 * All whitespace characters, including line breaks
	 */
	public static final String  REG_SPACE               = "\\p{Space}";
	/**
	 * Uppercase letters
	 */
	public static final String  REG_UPPER               = "\\p{Upper}";
	/**
	 * Hexadecimal digits
	 */
	public static final String  REG_XDIGIT              = "\\p{XDigit}";
	/**
	 * 空白行
	 */
	public static final String  REG_SPACE_LINE          = "\\n\\s*\\r";
	/**
	 * 首尾空白字符
	 */
	public static final String  REG_SPACE_POINT         = "^\\s*|\\s*$";
	/**
	 * HTML
	 */
	public static final String  REG_HTML                = "<(\\S*?)[^>]*>.*?</\\1>|<.*? />";
	/**
	 * Email
	 */
	public static final String  REG_EMAIL               = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";
	/**
	 * 国内固定电话
	 */
	public static final String  REG_FIXED_TELEPHONE     = "\\d{3}-\\d{8}|\\d{4}-\\d{7}";
	/**
	 * 邮政编码
	 */
	public static final String  REG_POSTALCODE          = "[1-9]\\d{5}(?!\\d)";
	/**
	 * 身份证编码
	 */
	public static final String  REG_IDENTIFICATION_CARD = "\\d{15}|\\d{18}";
	/**
	 * URL地址
	 */
	public static final String  REG_URL                 = "^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$";
	/**
	 * 移动电话
	 */
	public static final String  REG_MOBILE_TELEPHONE    = "^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$";
	/**
	 * 合法的名字（字母开头，允许5-16字节，允许字母数字下划线）
	 */
	public static final String  REG_LEGAL_ACCOUNT       = "^[a-zA-Z][a-zA-Z0-9_]{4,15}$";
	/**
	 * i地址
	 */
	public static final String  REG_IP                  = "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)";
	private static      Pattern numericPattern          = Pattern.compile("^[0-9\\-]+$");
	private static      Pattern numericStringPattern    = Pattern.compile("^[0-9\\-\\-]+$");
	private static      Pattern floatNumericPattern     = Pattern.compile("^[0-9\\-\\.]+$");
	private static      Pattern abcPattern              = Pattern.compile("^[a-z|A-Z]+$");

	/**
	 * 判断是否数字表示
	 *
	 * @param src 源字符串
	 * @return 是否数字的标志
	 */
	public final static boolean isNumeric(String src) {
		boolean return_value = false;
		if (src != null && src.length() > 0) {
			Matcher m = numericPattern.matcher(src);
			if (m.find()) {
				return_value = true;
			}
		}
		return return_value;
	}

	/**
	 * 判断是否纯字母组合
	 *
	 * @param src 源字符串
	 * @return 是否纯字母组合的标志
	 */
	public final static boolean isABC(String src) {
		boolean return_value = false;
		if (src != null && src.length() > 0) {
			Matcher m = abcPattern.matcher(src);
			if (m.find()) {
				return_value = true;
			}
		}
		return return_value;
	}


	/**
	 * 判断是否浮点数字表示
	 *
	 * @param src 源字符串
	 * @return 是否数字的标志
	 */
	public final static boolean isFloatNumeric(String src) {
		boolean return_value = false;
		if (src != null && src.length() > 0) {
			Matcher m = floatNumericPattern.matcher(src);
			if (m.find()) {
				return_value = true;
			}
		}
		return return_value;
	}

	/**
	 * 判断字符串str是否符合正则表达式reg
	 *
	 * @param str 需要处理的字符串
	 * @param reg 正则
	 * @return 是否匹配
	 */
	public final static boolean isMatche(String str, String reg) {
		Pattern pattern = Pattern.compile(reg);
		Matcher isNum   = pattern.matcher(str);
		return isNum.matches();
	}

	/**
	 * 获取符合reg正则表达式的字符串在String中出现的次数
	 *
	 * @param str 需要处理的字符串
	 * @param reg 正则
	 * @return 出现的次数
	 */
	public final static int countSubStrReg(String str, String reg) {
		Pattern p = Pattern.compile(reg);
		Matcher m = p.matcher(str);
		int     i = 0;
		while (m.find()) {
			i++;
		}
		return i;
	}


	/**
	 * 判断是否是符合邮箱
	 *
	 * @param email 判断的字符串
	 * @return 是否是符合的邮箱
	 */
	public final static boolean isEmail(String email) {
		if (email == null || email.length() < 1 || email.length() > 256) {
			return false;
		}
		Pattern pattern = Pattern.compile(REG_EMAIL);
		return pattern.matcher(email).matches();
	}
}
